package edu.upn.sigemfi.plt.beans;

import edu.upn.sigemfi.plt.bc.DetalleSeguroDelegate;
import edu.upn.sigemfi.plt.bc.MicroseguroDelegate;
import edu.upn.sigemfi.plt.bc.TipoMicroseguroDelegate;
import edu.upn.sigemfi.plt.be.DetalleSeguro;
import edu.upn.sigemfi.plt.be.DetalleSeguroPK;
import edu.upn.sigemfi.plt.be.EstadoMicroseguro;
import edu.upn.sigemfi.plt.be.Microseguro;
import edu.upn.sigemfi.plt.be.TipoFrecuenciaPrima;
import edu.upn.sigemfi.plt.be.TipoMicroseguro;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import edu.upn.sigemfi.seg.beans.AbstractController;
import java.util.Date;

public class MicroseguroController extends AbstractController {

    private MicroseguroDelegate microseguroDelegado;
    private TipoMicroseguroDelegate tipoMicroseguroDelegado;
    private Microseguro microseguro;
    private List<TipoMicroseguro> listaTipoMicroseguros = new ArrayList<TipoMicroseguro>();
    private PersonaNatural personaNaturalTemp;
    private DetalleSeguro detalleSeguro;
    private DetalleSeguroPK detalleSeguroPK;
    private DetalleSeguroDelegate detalleSeguroDelegado;
    private List<PersonaNatural> personasNaturalesAgregar;
    private boolean bolAgregarPersonaNatural;
    private boolean bolAgregarCliente;
    private boolean esClienteNatural;
    private AsociacionSeguroClienteController asosegcont;

    public MicroseguroController() {
        microseguroDelegado = new MicroseguroDelegate();
        tipoMicroseguroDelegado = new TipoMicroseguroDelegate();
        detalleSeguroDelegado = new DetalleSeguroDelegate();
        detalleSeguro = new DetalleSeguro();
        microseguro = new Microseguro();
        detalleSeguroPK = new DetalleSeguroPK();
        personasNaturalesAgregar = new ArrayList<PersonaNatural>();
        personaNaturalTemp = new PersonaNatural();
        try {
            listaTipoMicroseguros = tipoMicroseguroDelegado.listar();
        } catch (Exception e) {
        }
        bolAgregarPersonaNatural = false;
        bolAgregarCliente = false;
        esClienteNatural = false;
    }

    public String reiniciarEstados() {
        personasNaturalesAgregar = null;
        return "";
    }

    public String Cancelar() {
        bolAgregarCliente = false;
        bolAgregarPersonaNatural = false;
        esClienteNatural = false;
        return "cancelarmicroseguro";
    }

    public String index() {
        return "index";
    }

    public String microseguro() {
        return "microseguro";
    }

    public String mostrar() {
        return "mostrar";
    }

    public String listar() {
        return "listar";
    }

    public String editar() {
        return "editar";
    }

    public String nuevo() {
        microseguro = new Microseguro();
        return "nuevo";
    }

    public String registrar() {
        AsociacionSeguroClienteController tempcontroller = (AsociacionSeguroClienteController) getBean("AsociacionSeguroClienteController");
        if(tempcontroller != null){
             personasNaturalesAgregar = tempcontroller.personasNaturalesAgregar;//para controlar la opcion de agregar persona NATURAL
        }
        try {
            Date fechaMicroseguro = new Date();
            microseguro.setFechaRegistro(fechaMicroseguro);
            microseguro.setEstado(EstadoMicroseguro.Creado);
            microseguroDelegado.crear(microseguro);
            detalleSeguroPK = new DetalleSeguroPK();
            detalleSeguroPK.setFidPltMicroseguro(microseguro.getIdMicroseguro());
            //cuando agregamos titulares desde nuevo
            if (personasNaturalesAgregar != null) {
                for (PersonaNatural pn : personasNaturalesAgregar) {
                    detalleSeguroPK.setFidSegPersona(pn.getIdPersona());
                    detalleSeguro.setDetalleSeguroPK(detalleSeguroPK);

                    detalleSeguroDelegado.crear(detalleSeguro);
                }
            }
            personasNaturalesAgregar = new ArrayList<PersonaNatural>();
            microseguro = new Microseguro();
            reiniciarEstados();
            tempcontroller.reiniciarEstados();
            bolAgregarCliente = false;
            bolAgregarPersonaNatural = false;
            esClienteNatural = false;
            info("El Microseguro se registró correctamente");
        } catch (Exception e) {
            error(e.getMessage());
        }
        return "microseguroAsociado";
    }

    public String actualizar() {
        try {
            microseguroDelegado.editar(microseguro);
            info("El Microseguro se actualizó correctamente");
        } catch (Exception e) {
            error(e.getMessage());
        }
        return "listar";
    }

    public String eliminar() {
        try {
            microseguroDelegado.eliminar(microseguro);
            info("El Microseguro se eliminó correctamente");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "volver";
    }

    public Microseguro buscar(Long codigo) {
        try {
            return microseguroDelegado.buscar(codigo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public List<Microseguro> getMicroseguros() {
        try {
            return microseguroDelegado.listar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public SelectItem[] getTipoMicroseguros() {
        SelectItem[] selects = null;
        try {
            //permite qeu siempre obtengamos la lista actualizada
            //de lo qeu acabamos de ingresar
            listaTipoMicroseguros = tipoMicroseguroDelegado.listar();
        } catch (Exception e) {
        }
        try {
            selects = new SelectItem[listaTipoMicroseguros.size()];
            int i = 0;
            for (TipoMicroseguro tm : listaTipoMicroseguros) {
                selects[i++] = new SelectItem(tm, tm.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar tipo de microseguros");
            System.out.println(e.getMessage());
            error(e.getMessage());
        }
        return selects;
    }

    public SelectItem[] getEstadoMicroseguros() {
        EstadoMicroseguro[] estadoMicroseguro = EstadoMicroseguro.values();
        SelectItem[] select = new SelectItem[estadoMicroseguro.length];

        int i = 0;
        for (EstadoMicroseguro em : estadoMicroseguro) {
            select[i++] = new SelectItem(em, em.toString());
        }
        return select;
    }

     public SelectItem[] getTipoFrecuenciaPrima() {
        TipoFrecuenciaPrima[] tipoFrecuenciaPrima = TipoFrecuenciaPrima.values();
        SelectItem[] select = new SelectItem[tipoFrecuenciaPrima.length];

        int i = 0;
        for (TipoFrecuenciaPrima tfp : tipoFrecuenciaPrima) {
            select[i++] = new SelectItem(tfp, tfp.toString());
        }
        return select;
    }

    public Microseguro getMicroseguro() {
        return microseguro;
    }

    public void setMicroseguro(Microseguro microseguro) {
        this.microseguro = microseguro;
    }

    public boolean isBolAgregarCliente() {
        return bolAgregarCliente;
    }

    public void setBolAgregarCliente(boolean bolAgregarCliente) {
        this.bolAgregarCliente = bolAgregarCliente;
    }

    public boolean isBolAgregarPersonaNatural() {
        return bolAgregarPersonaNatural;
    }

    public void setBolAgregarPersonaNatural(boolean bolAgregarPersonaNatural) {
        this.bolAgregarPersonaNatural = bolAgregarPersonaNatural;
    }

    public DetalleSeguro getDetalleSeguro() {
        return detalleSeguro;
    }

    public void setDetalleSeguro(DetalleSeguro detalleSeguro) {
        this.detalleSeguro = detalleSeguro;
    }

    public DetalleSeguroPK getDetalleSeguroPK() {
        return detalleSeguroPK;
    }

    public void setDetalleSeguroPK(DetalleSeguroPK detalleSeguroPK) {
        this.detalleSeguroPK = detalleSeguroPK;
    }

    public List<TipoMicroseguro> getListaTipoMicroseguros() {
        return listaTipoMicroseguros;
    }

    public void setListaTipoMicroseguros(List<TipoMicroseguro> listaTipoMicroseguros) {
        this.listaTipoMicroseguros = listaTipoMicroseguros;
    }

    public MicroseguroDelegate getMicroseguroDelegado() {
        return microseguroDelegado;
    }

    public void setMicroseguroDelegado(MicroseguroDelegate microseguroDelegado) {
        this.microseguroDelegado = microseguroDelegado;
    }

    public PersonaNatural getPersonaNaturalTemp() {
        return personaNaturalTemp;
    }

    public void setPersonaNaturalTemp(PersonaNatural personaNaturalTemp) {
        this.personaNaturalTemp = personaNaturalTemp;
    }

    public List<PersonaNatural> getPersonasNaturalesAgregar() {
        return personasNaturalesAgregar;
    }

    public void setPersonasNaturalesAgregar(List<PersonaNatural> personasNaturalesAgregar) {
        this.personasNaturalesAgregar = personasNaturalesAgregar;
    }

    public TipoMicroseguroDelegate getTipoMicroseguroDelegado() {
        return tipoMicroseguroDelegado;
    }

    public void setTipoMicroseguroDelegado(TipoMicroseguroDelegate tipoMicroseguroDelegado) {
        this.tipoMicroseguroDelegado = tipoMicroseguroDelegado;
    }

    public DetalleSeguroDelegate getDetalleSeguroDelegado() {
        return detalleSeguroDelegado;
    }

    public void setDetalleSeguroDelegado(DetalleSeguroDelegate detalleSeguroDelegado) {
        this.detalleSeguroDelegado = detalleSeguroDelegado;
    }

    public boolean isEsClienteNatural() {
        return esClienteNatural;
    }

    public void setEsClienteNatural(boolean esClienteNatural) {
        this.esClienteNatural = esClienteNatural;
    }

    public AsociacionSeguroClienteController getAsosegcont() {
        return asosegcont;
    }

    public void setAsosegcont(AsociacionSeguroClienteController asosegcont) {
        this.asosegcont = asosegcont;
    }
}
